﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

using SIMA.Entities;
using SIMA.Core.Data.Access;
using SIMA.Core.Data.Collection;
using SIMA.Controls;
using SIMA.Core.Enums;
using SIMA.Core.Extension;

namespace SIMA.Client.Auxiliars.MVVM
{
    public class GestionarEquipoMvvm:AccessClass<T_C_Equipo>
    {

        #region Consts

        private const string SPSELECTACTIVE = "SelectActiveEquipo";
        private const string SPSELECTINACTIVE = "SelectInactiveEquipo";
        private const string SPSELECTONQEUE = "SelectOnQueueEquipo";
        private string IDEQUIPOTABLE = "5";
        #endregion

        #region Fields

        private T_C_Marca marcaActual;

        private List<T_C_Equipo> equipos;
        private List<T_C_Equipo> todosEquipos;
        private List<T_C_Marca> marcas;
        private List<T_C_Modelo> modelos;
        private List<T_C_Estado> estados;
        private List<T_C_Area> areas;

        private SmartContainer<T_C_Equipo> equiposSmart;
        private SmartContainer<T_C_Marca> marcasSmart;
        private SmartContainer<T_C_Modelo> modelosSmart;
        private SmartContainer<T_C_Estado> estadosSmart;
        private SmartContainer<T_C_Area> areasSmart;

        private FilterType filtro;

        #endregion

        #region Properties

        public List<T_C_Equipo> Equipos
        {
            get { return equipos; }
            set
            {
                equipos = value;
                RaisePropertyChanged("Equipos");
            }
        }

        public List<T_C_Equipo> TodosEquipos
        {
            get
            {
                return todosEquipos;
            }
            set
            {
                todosEquipos = value;
                this.RaisePropertyChanged("TodosEquipos");
            }
        }

        public List<T_C_Estado> Estados
        {
            get
            {
                return estados;
            }
            set
            {
                estados = value;
                RaisePropertyChanged("Estados");
            }
        }

        public List<T_C_Marca> Marcas
        {
            get
            {
                return marcas;
            }
            set
            {
                marcas = value;
                RaisePropertyChanged("Marcas");
            }
        }

        public List<T_C_Modelo> Modelos
        {
            get
            {
                return modelos;
            }
            set
            {
                modelos = value;
                RaisePropertyChanged("Modelos");
            }
        }

        public List<T_C_Area> Areas
        {
            get
            {
                return areas;
            }
            set
            {
                areas = value;
                this.RaisePropertyChanged("Areas");
            }
        }

        public T_C_Marca MarcaActual
        {
            get
            {
                return marcaActual;
            }
            set
            {
                marcaActual = value;
                RaisePropertyChanged("MarcaActual");
                if (value != null)
                {
                    SelectModelosFromMarcas();
                }
            }
        }

        public FilterType Filtro
        {
            get
            {
                return filtro;
            }
            set
            {
                filtro = value;
                RaisePropertyChanged("Filtro");
                SelectFromStates(value);
            }
        }

        #endregion

        #region Contructor

        public GestionarEquipoMvvm()
        {
            Init();
        }


        #endregion

        #region Destructor

        ~GestionarEquipoMvvm()
        {
            this.Dispose();
        }

        #endregion

        #region Private Methods

        private void Init()
        {
            DataAccess.SetConnection(SIMA.Core.Enums.AccessType.FromString, CADCONNECTIONSTRING);
            equiposSmart = new SmartContainer<T_C_Equipo>();

            equiposSmart.Inserted += new EventHandler<SIMA.Core.EventArgs.InsertedEventArgs>(equiposSmart_Inserted);
            equiposSmart.Deleted += new EventHandler<SIMA.Core.EventArgs.DeletedEventArgs>(equiposSmart_Deleted);
            equiposSmart.Updated += new EventHandler<SIMA.Core.EventArgs.UpdatedEventArgs>(equiposSmart_Updated);
            equiposSmart.Failed += new EventHandler<SIMA.Core.EventArgs.FailedEventArgs>(equiposSmart_Failed);

            marcasSmart = new SmartContainer<T_C_Marca>();
            Marcas = marcasSmart["SelectActiveMarca", CommandType.StoredProcedure];

            areasSmart = new SmartContainer<T_C_Area>();
            Areas = areasSmart["SelectActiveArea", CommandType.StoredProcedure];
            estadosSmart = new SmartContainer<T_C_Estado>();
            this.SelectEquiposStateOnly();
            Filtro = FilterType.Active;
        }

        private void SelectModelosFromMarcas()
        {
            modelosSmart = new SmartContainer<T_C_Modelo>(true);
            modelosSmart.SelectAll();
            Modelos = modelosSmart.ToList();
            Modelos = Modelos.Where(mod => mod.Id_Marca == MarcaActual.Id_Marca).ToList();
        }

        void equiposSmart_Failed(object sender, SIMA.Core.EventArgs.FailedEventArgs e)
        {
            SIMAMessageBox.Show(e.InstantFailed.ToLongTimeString(), e.ExceptionOcurred.Message, e.ExceptionOcurred.StackTrace, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Error);
        }

        void equiposSmart_Updated(object sender, SIMA.Core.EventArgs.UpdatedEventArgs e)
        {
            SIMAMessageBox.Show(e.InstantUpdated.ToLongTimeString(), "Equipo actualizado.", e.QueryString, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Information);
            SelectFromStates(filtro);
        }

        void equiposSmart_Deleted(object sender, SIMA.Core.EventArgs.DeletedEventArgs e)
        {
            SIMAMessageBox.Show(e.InstantDeleted.ToLongTimeString(), "Equipo eliminado.", e.QueryString, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Information);
            SelectFromStates(filtro);
        }

        void equiposSmart_Inserted(object sender, SIMA.Core.EventArgs.InsertedEventArgs e)
        {
            SIMAMessageBox.Show(e.InstantInserted.ToLongTimeString(), "Equipo registrado.", e.QueryString, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Information);
            SelectFromStates(filtro);
        }

        #endregion

        #region Public Methods

        public override void Register(T_C_Equipo item)
        {
            equiposSmart.Add(item);
        }

        public override void Delete(T_C_Equipo item)
        {
            equiposSmart.Remove(item);
        }

        public override void Update(T_C_Equipo itemToUpdate, T_C_Equipo itemUpdated)
        {
            equiposSmart.Update(itemToUpdate, itemUpdated);
        }

        public override void SelectAll()
        {
            equiposSmart.SelectAll();
            equipos = equiposSmart.ToList();
        }

        public void SelectEquiposStateOnly()
        {
            StringBuilder strBuilder = new StringBuilder();
            strBuilder.Append("Id_Tabla=");
            strBuilder.Append(IDEQUIPOTABLE);
            Estados = estadosSmart[strBuilder.ToString(), CommandType.CommandText];
        }

        public void SelectFromStates(FilterType filter)
        {
            switch (filter)
            {
                case FilterType.Active:
                    Equipos = equiposSmart[SPSELECTACTIVE, CommandType.StoredProcedure];
                    TodosEquipos = Equipos.Clone();
                    break;
                case FilterType.Inactive:
                    Equipos = equiposSmart[SPSELECTINACTIVE, CommandType.StoredProcedure];
                    break;
                case FilterType.OnQueue:
                    Equipos = equiposSmart[SPSELECTONQEUE, CommandType.StoredProcedure];
                    break;
            }
            //TodosEquipos = equiposSmart[SPSELECTACTIVE, CommandType.StoredProcedure];
        }

        #endregion



    }
}
